# === MODÉLISATION PRÉDICTIVE DES ATTAQUES TERRORISTES ===

# Chargement des bibliothèques nécessaires
library(tidyverse)    # Pour la manipulation des données
## Warning: le package 'tidyverse' a été compilé avec la version R 4.4.2
## Warning: le package 'ggplot2' a été compilé avec la version R 4.4.2
## Warning: le package 'forcats' a été compilé avec la version R 4.4.1
## Warning: le package 'lubridate' a été compilé avec la version R 4.4.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret)        # Pour la division des données et les métriques
## Le chargement a nécessité le package : lattice
## 
## Attachement du package : 'caret'
## 
## L'objet suivant est masqué depuis 'package:purrr':
## 
##     lift
library(randomForest) # Pour le modèle Random Forest
## Warning: le package 'randomForest' a été compilé avec la version R 4.4.2
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attachement du package : 'randomForest'
## 
## L'objet suivant est masqué depuis 'package:dplyr':
## 
##     combine
## 
## L'objet suivant est masqué depuis 'package:ggplot2':
## 
##     margin
library(xgboost)      # Pour le modèle XGBoost
## Warning: le package 'xgboost' a été compilé avec la version R 4.4.2
## 
## Attachement du package : 'xgboost'
## 
## L'objet suivant est masqué depuis 'package:dplyr':
## 
##     slice
library(ROCR)         # Pour les courbes ROC
## Warning: le package 'ROCR' a été compilé avec la version R 4.4.2
library(nnet)         # Pour le modèle Neural Network
## Warning: le package 'nnet' a été compilé avec la version R 4.4.2
library(plotly)       # Pour les graphiques interactifs
## Warning: le package 'plotly' a été compilé avec la version R 4.4.2
## 
## Attachement du package : 'plotly'
## 
## L'objet suivant est masqué depuis 'package:xgboost':
## 
##     slice
## 
## L'objet suivant est masqué depuis 'package:ggplot2':
## 
##     last_plot
## 
## L'objet suivant est masqué depuis 'package:stats':
## 
##     filter
## 
## L'objet suivant est masqué depuis 'package:graphics':
## 
##     layout
library(viridis)      # Pour les palettes de couleurs
## Warning: le package 'viridis' a été compilé avec la version R 4.4.2
## Le chargement a nécessité le package : viridisLite
library(readr)        # Pour la lecture des fichiers CSV

# === 1. CHARGEMENT DES DONNÉES ===
cat("\n=== CHARGEMENT DES DONNÉES ===\n")
## 
## === CHARGEMENT DES DONNÉES ===
# Lecture du fichier CSV avec read_csv
gtd_data <- read_csv("C:/Users/digor/OneDrive/Documents/Projet_SCI1402_analyse_GTD/data/processed/gtd_clean.csv", 
                     show_col_types = FALSE)
cat("Données chargées avec succès !\n")
## Données chargées avec succès !
# Aperçu des premières lignes
head(gtd_data)
## # A tibble: 6 × 145
##    eventid iyear imonth  iday approxdate extended resolution country country_txt
##      <dbl> <dbl>  <dbl> <dbl> <chr>         <dbl> <chr>      <chr>   <chr>      
## 1  1.97e11  1970      7     2 Unknown           0 Unknown    Unknown Dominican …
## 2  1.97e11  1970      0     0 Unknown           0 Unknown    Unknown Mexico     
## 3  1.97e11  1970      1     0 Unknown           0 Unknown    Unknown Philippines
## 4  1.97e11  1970      1     0 Unknown           0 Unknown    Unknown Greece     
## 5  1.97e11  1970      1     0 Unknown           0 Unknown    Unknown Japan      
## 6  1.97e11  1970      1     1 Unknown           0 Unknown    Unknown United Sta…
## # ℹ 136 more variables: region <chr>, region_txt <chr>, provstate <chr>,
## #   city <chr>, latitude <dbl>, longitude <dbl>, specificity <dbl>,
## #   vicinity <dbl>, location <chr>, summary <chr>, crit1 <dbl>, crit2 <dbl>,
## #   crit3 <dbl>, doubtterr <dbl>, alternative <dbl>, alternative_txt <chr>,
## #   multiple <dbl>, success <lgl>, suicide <dbl>, attacktype1 <dbl>,
## #   attacktype1_txt <chr>, attacktype2 <dbl>, attacktype2_txt <chr>,
## #   attacktype3 <dbl>, attacktype3_txt <chr>, targtype1 <dbl>, …
# === 2. PRÉPARATION DES DONNÉES ===
cat("\n=== PRÉPARATION DES DONNÉES ===\n")
## 
## === PRÉPARATION DES DONNÉES ===
# Sélectionner la cible (success) et les variables prédictives importantes
# "success" est la variable cible binaire (1 = succès, 0 = échec)

data <- gtd_data %>%
  select(success, iyear, region, attacktype1, targtype1, natlty1) %>%
  drop_na()  # Retirer les lignes avec des valeurs manquantes

# Vérifier les niveaux des facteurs et supprimer les variables avec un seul niveau
data <- data %>% mutate(across(where(is.character), as.factor))
data <- data %>% select_if(~!is.factor(.) || nlevels(.) > 1)

# Assurer que la variable 'success' est binaire
data$success <- as.factor(ifelse(data$success == TRUE, 1, 0))

# Diviser les données en train (70%) et test (30%)
set.seed(123)  # Pour la reproductibilité
train_index <- createDataPartition(data$success, p = 0.7, list = FALSE)
train_data <- data[train_index, ]
test_data <- data[-train_index, ]

# === 3. ENTRAÎNEMENT DES MODÈLES ===
cat("\n=== ENTRAÎNEMENT DES MODÈLES ===\n")
## 
## === ENTRAÎNEMENT DES MODÈLES ===
# 3.1 Régression Logistique
cat("\n--- Modèle : Régression Logistique ---\n")
## 
## --- Modèle : Régression Logistique ---
logistic_model <- glm(success ~ ., data = train_data, family = binomial)
logistic_pred <- predict(logistic_model, test_data, type = "response")
logistic_pred_class <- ifelse(logistic_pred > 0.5, 1, 0)

# 3.2 Random Forest
cat("\n--- Modèle : Random Forest ---\n")
## 
## --- Modèle : Random Forest ---
rf_model <- randomForest(success ~ ., data = train_data, ntree = 100)
rf_pred <- predict(rf_model, test_data, type = "class")

# 3.3 XGBoost
cat("\n--- Modèle : XGBoost ---\n")
## 
## --- Modèle : XGBoost ---
# Conversion en format matriciel pour XGBoost
train_matrix <- xgb.DMatrix(data = as.matrix(train_data %>% select(-success)), label = as.numeric(train_data$success) - 1)
test_matrix <- xgb.DMatrix(data = as.matrix(test_data %>% select(-success)))

xgb_model <- xgboost(data = train_matrix, max.depth = 3, eta = 0.1, nrounds = 100, objective = "binary:logistic")
## [1]  train-logloss:0.629645 
## [2]  train-logloss:0.577801 
## [3]  train-logloss:0.534920 
## [4]  train-logloss:0.499110 
## [5]  train-logloss:0.468993 
## [6]  train-logloss:0.443518 
## [7]  train-logloss:0.421892 
## [8]  train-logloss:0.403453 
## [9]  train-logloss:0.387713 
## [10] train-logloss:0.374222 
## [11] train-logloss:0.362628 
## [12] train-logloss:0.352695 
## [13] train-logloss:0.344193 
## [14] train-logloss:0.336912 
## [15] train-logloss:0.330466 
## [16] train-logloss:0.324759 
## [17] train-logloss:0.320092 
## [18] train-logloss:0.315834 
## [19] train-logloss:0.312282 
## [20] train-logloss:0.309210 
## [21] train-logloss:0.306420 
## [22] train-logloss:0.304089 
## [23] train-logloss:0.302002 
## [24] train-logloss:0.300261 
## [25] train-logloss:0.298726 
## [26] train-logloss:0.297384 
## [27] train-logloss:0.296085 
## [28] train-logloss:0.295059 
## [29] train-logloss:0.294135 
## [30] train-logloss:0.293350 
## [31] train-logloss:0.292245 
## [32] train-logloss:0.291580 
## [33] train-logloss:0.290824 
## [34] train-logloss:0.290272 
## [35] train-logloss:0.289655 
## [36] train-logloss:0.288998 
## [37] train-logloss:0.288386 
## [38] train-logloss:0.287969 
## [39] train-logloss:0.287533 
## [40] train-logloss:0.287197 
## [41] train-logloss:0.286832 
## [42] train-logloss:0.286363 
## [43] train-logloss:0.286085 
## [44] train-logloss:0.285660 
## [45] train-logloss:0.285314 
## [46] train-logloss:0.285065 
## [47] train-logloss:0.284750 
## [48] train-logloss:0.284341 
## [49] train-logloss:0.284146 
## [50] train-logloss:0.283867 
## [51] train-logloss:0.283495 
## [52] train-logloss:0.283220 
## [53] train-logloss:0.283073 
## [54] train-logloss:0.282913 
## [55] train-logloss:0.282688 
## [56] train-logloss:0.282388 
## [57] train-logloss:0.282172 
## [58] train-logloss:0.281912 
## [59] train-logloss:0.281691 
## [60] train-logloss:0.281383 
## [61] train-logloss:0.281278 
## [62] train-logloss:0.281151 
## [63] train-logloss:0.280979 
## [64] train-logloss:0.280774 
## [65] train-logloss:0.280582 
## [66] train-logloss:0.280411 
## [67] train-logloss:0.280325 
## [68] train-logloss:0.279956 
## [69] train-logloss:0.279672 
## [70] train-logloss:0.279527 
## [71] train-logloss:0.279351 
## [72] train-logloss:0.279249 
## [73] train-logloss:0.279084 
## [74] train-logloss:0.278918 
## [75] train-logloss:0.278775 
## [76] train-logloss:0.278511 
## [77] train-logloss:0.278360 
## [78] train-logloss:0.278219 
## [79] train-logloss:0.278094 
## [80] train-logloss:0.277884 
## [81] train-logloss:0.277662 
## [82] train-logloss:0.277464 
## [83] train-logloss:0.277266 
## [84] train-logloss:0.277148 
## [85] train-logloss:0.277063 
## [86] train-logloss:0.276943 
## [87] train-logloss:0.276854 
## [88] train-logloss:0.276749 
## [89] train-logloss:0.276601 
## [90] train-logloss:0.276408 
## [91] train-logloss:0.276162 
## [92] train-logloss:0.275832 
## [93] train-logloss:0.275667 
## [94] train-logloss:0.275573 
## [95] train-logloss:0.275508 
## [96] train-logloss:0.275351 
## [97] train-logloss:0.275204 
## [98] train-logloss:0.275028 
## [99] train-logloss:0.274956 
## [100]    train-logloss:0.274862
xgb_pred <- predict(xgb_model, test_matrix)
xgb_pred_class <- ifelse(xgb_pred > 0.5, 1, 0)

# 3.4 Neural Network
cat("\n--- Modèle : Neural Network ---\n")
## 
## --- Modèle : Neural Network ---
nn_model <- nnet(success ~ ., data = train_data, size = 5, trace = FALSE)
nn_pred <- predict(nn_model, test_data, type = "raw")
nn_pred_class <- ifelse(nn_pred > 0.5, 1, 0)

# === 4. CALCUL DES MÉTRIQUES ===
cat("\n=== CALCUL DES MÉTRIQUES ===\n")
## 
## === CALCUL DES MÉTRIQUES ===
# Fonction pour calculer les métriques (Accuracy, Precision, Recall, F1)
calculate_metrics <- function(actual, predicted) {
  confusion <- confusionMatrix(as.factor(predicted), as.factor(actual))
  list(
    Accuracy = round(confusion$overall['Accuracy'], 3),
    Precision = round(confusion$byClass['Pos Pred Value'], 3),
    Recall = round(confusion$byClass['Sensitivity'], 3),
    F1 = round(2 * (confusion$byClass['Pos Pred Value'] * confusion$byClass['Sensitivity']) /
                 (confusion$byClass['Pos Pred Value'] + confusion$byClass['Sensitivity']), 3)
  )
}

# Calculer les métriques pour chaque modèle
metrics <- list(
  Logistic_Regression = calculate_metrics(test_data$success, logistic_pred_class),
  Random_Forest = calculate_metrics(test_data$success, rf_pred),
  XGBoost = calculate_metrics(test_data$success, xgb_pred_class),
  Neural_Network = calculate_metrics(test_data$success, nn_pred_class)
)
## Warning in confusionMatrix.default(as.factor(predicted), as.factor(actual)):
## Levels are not in the same order for reference and data. Refactoring data to
## match.
## Warning in confusionMatrix.default(as.factor(predicted), as.factor(actual)):
## Levels are not in the same order for reference and data. Refactoring data to
## match.
print(metrics)
## $Logistic_Regression
## $Logistic_Regression$Accuracy
## Accuracy 
##     0.89 
## 
## $Logistic_Regression$Precision
## Pos Pred Value 
##            NaN 
## 
## $Logistic_Regression$Recall
## Sensitivity 
##           0 
## 
## $Logistic_Regression$F1
## Pos Pred Value 
##            NaN 
## 
## 
## $Random_Forest
## $Random_Forest$Accuracy
## Accuracy 
##    0.904 
## 
## $Random_Forest$Precision
## Pos Pred Value 
##          0.651 
## 
## $Random_Forest$Recall
## Sensitivity 
##        0.28 
## 
## $Random_Forest$F1
## Pos Pred Value 
##          0.391 
## 
## 
## $XGBoost
## $XGBoost$Accuracy
## Accuracy 
##    0.902 
## 
## $XGBoost$Precision
## Pos Pred Value 
##          0.714 
## 
## $XGBoost$Recall
## Sensitivity 
##       0.188 
## 
## $XGBoost$F1
## Pos Pred Value 
##          0.298 
## 
## 
## $Neural_Network
## $Neural_Network$Accuracy
## Accuracy 
##     0.89 
## 
## $Neural_Network$Precision
## Pos Pred Value 
##            NaN 
## 
## $Neural_Network$Recall
## Sensitivity 
##           0 
## 
## $Neural_Network$F1
## Pos Pred Value 
##            NaN
# === 5. VISUALISATION DES RÉSULTATS ===
cat("\n=== VISUALISATION DES RÉSULTATS ===\n")
## 
## === VISUALISATION DES RÉSULTATS ===
# Afficher les métriques dans un graphique interactif
metrics_df <- do.call(rbind, metrics) %>%
  as.data.frame() %>%
  rownames_to_column("Modèle")

plot_ly(metrics_df, x = ~Modèle, y = ~Accuracy, type = 'bar', name = 'Accuracy') %>%
  add_trace(y = ~Precision, name = 'Precision') %>%
  add_trace(y = ~Recall, name = 'Recall') %>%
  add_trace(y = ~F1, name = 'F1') %>%
  layout(title = "Performance des modèles",
         barmode = 'group',
         xaxis = list(title = "Modèles"),
         yaxis = list(title = "Score"))
# === FIN DU SCRIPT ===
cat("\n=== MODÉLISATION TERMINÉE ===\n")
## 
## === MODÉLISATION TERMINÉE ===